home *** CD-ROM | disk | FTP | other *** search
- /*
- * Archivers.cpp
- *
- * MIDAS Module Player for Windows NT archiver support
- *
- * Copyright 1996 Petteri Kangaslampi
- */
-
- #define WIN32_LEAN_AND_MEAN
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <process.h>
- #include <dos.h>
-
- #include "midasdll.h"
-
- #ifdef __VC32__
- #include <io.h>
- #endif
-
- #include "MidpNT.h"
- #include "archivers.h"
-
-
-
- int numArchives = 4;
- Archive archives[4] =
- {
- { ".mdz", "unzip -o \"%s\" -d %s" },
- { ".s3z", "unzip -o \"%s\" -d %s" },
- { ".xmz", "unzip -o \"%s\" -d %s" },
- { ".zip", "unzip -o \"%s\" -d %s" }
- };
-
-
-
-
- /****************************************************************************\
- *
- * Function: int IsArchive(char *fileName);
- *
- * Description: Checks if a file is an archive (based on the extension)
- *
- * Input: char *fileName file name
- *
- * Returns: 1 if the file is an archive, 0 if not
- *
- \****************************************************************************/
-
- int IsArchive(char *fileName)
- {
- int i;
- char ext[_MAX_EXT];
-
- _splitpath(fileName, NULL, NULL, NULL, ext);
-
- for ( i = 0; i < numArchives; i++ )
- {
- if ( !stricmp(ext, archives[i].extension) )
- return 1;
- }
-
- return 0;
- }
-
-
-
-
- /****************************************************************************\
- *
- * Function: MIDASmodule LoadArchive(char *fileName);
- *
- * Description: Loads a module from an archive
- *
- * Input: char *fileName file name
- *
- * Returns: MIDAS module handle for the module or NULL if failed
- *
- \****************************************************************************/
-
- MIDASmodule LoadArchive(char *fileName)
- {
- int i;
- char ext[_MAX_EXT];
- char file[_MAX_FNAME];
- char *decompress;
- char commandLine[_MAX_PATH + 128];
- STARTUPINFO startInfo;
- PROCESS_INFORMATION procInfo;
- DWORD exitCode;
- WIN32_FIND_DATA findData;
- HANDLE findHandle;
- DWORD creationFlags;
- SECURITY_ATTRIBUTES secAttr = { sizeof(SECURITY_ATTRIBUTES), NULL, FALSE};
- int fileFound;
- MIDASmodule module;
-
- AddTextLine("Decompressing module");
- SendMessage(mainWinHandle, WM_SETTEXT, 0,
- (LPARAM) "MidpNT - Decompressing...");
-
- GetCurrentDirectory(MAX_PATH+127, commandLine);
- if ( SetCurrentDirectory(unzipDir) )
- {
- SetCurrentDirectory(commandLine);
- sprintf(commandLine, "Directory \"%s\" already exists", unzipDir);
- MessageBox(NULL, commandLine, "Decompression error",
- MB_ICONERROR | MB_OK);
- return NULL;
- }
-
- _splitpath(fileName, NULL, NULL, file, ext);
-
- decompress = NULL;
- for ( i = 0; i < numArchives; i++ )
- {
- if ( !stricmp(ext, archives[i].extension) )
- decompress = archives[i].decompress;
- }
-
- if ( decompress == NULL )
- Panic("Decompress: Unknown extension!");
-
- sprintf(commandLine, decompress, fileName, unzipDir);
- AddTextLine(commandLine);
-
- startInfo.cb = sizeof(STARTUPINFO);
- startInfo.lpReserved = NULL;
- startInfo.lpDesktop = NULL;
- startInfo.lpTitle = commandLine;
- startInfo.dwFlags = STARTF_USESHOWWINDOW;
- startInfo.wShowWindow = SW_HIDE;
- startInfo.cbReserved2 = 0;
- startInfo.lpReserved2 = NULL;
-
- creationFlags = CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS;
-
- if ( !CreateProcess(NULL, commandLine, NULL, NULL, FALSE,
- creationFlags, NULL, NULL,
- &startInfo, &procInfo) )
- {
- sprintf(commandLine, "Decompress: CreateProcess failed: %i",
- GetLastError());
- Panic(commandLine);
- }
-
- exitCode = STILL_ACTIVE;
- while ( exitCode == STILL_ACTIVE )
- {
- Sleep(250);
- if ( !GetExitCodeProcess(procInfo.hProcess, &exitCode) )
- {
- sprintf(commandLine, "Decompress: GetExitCodeProcess failed: %i",
- GetLastError());
- Panic(commandLine);
- }
- }
-
- if ( exitCode != 0 )
- {
- sprintf(commandLine, "Decompressor failed: %i",
- exitCode);
- MessageBox(NULL, commandLine, "Decompression error",
- MB_OK | MB_ICONERROR);
- return NULL;
- }
-
- AddTextLine("Loading Module");
- SendMessage(mainWinHandle, WM_SETTEXT, 0, (LPARAM) "MidpNT - Loading...");
-
- sprintf(commandLine, "%s\\*.*", unzipDir, file);
-
- if ( (findHandle = FindFirstFile(commandLine, &findData))
- == INVALID_HANDLE_VALUE )
- {
- MessageBox(NULL, "Decompressed file not found", "Decompression error",
- MB_OK | MB_ICONERROR);
- return NULL;
- }
-
- fileFound = 0;
-
- do
- {
- if ( !(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
- {
- sprintf(commandLine, "%s\\%s", unzipDir, findData.cFileName);
-
- if ( (module = MIDASloadModule(commandLine)) != NULL )
- {
- fileFound = 1;
- }
-
- if ( !DeleteFile(commandLine) )
- {
- MessageBox(NULL, "Couldn't delete file",
- "Decompression error", MB_OK | MB_ICONERROR);
- return NULL;
- }
- }
- } while ( (!fileFound) && FindNextFile(findHandle, &findData) );
-
- FindClose(findHandle);
-
- RemoveDirectory(unzipDir);
-
- if ( fileFound )
- return module;
-
- MessageBox(NULL, "No valid module files found", "Decompression error",
- MB_OK | MB_ICONERROR);
- return NULL;
- }